import axios from 'axios'
import store from '@/store'
import router from '@/router'
// 引入获取时间戳的方法
import { getTimeStamp } from './auth'

// 引入插件做错误提示
import { Message } from 'element-ui'

const checkTimeout = () => {
  // 1.拿到当前时间
  const now = Date.now()
  // 2.拿到以前记录的时间
  const loginTime = getTimeStamp()
  // 3.定义超时时间
  const timeout = 1000 * 60 * 60 * 24
  // 4.满足清除token条件判断并返回
  return now - loginTime > timeout
}

// 创建一个实例 把axios变成service，变成这样是为了以后创建多个基地址
const service = axios.create({
  // 基地址不一定要是完整的，他只要保证在请求地址前面加上就可以
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000 // 超过5秒没有响应自动报错
})

// 请求拦截器
service.interceptors.request.use(config => {
  // 有token才加进去，登陆页一开始没有，不用加 token 格式, 最前方有个 'Bearer ' 字符串, 注意最后的空格
  if (store.getters.token) {
    // 如果时间戳超时，也就是checkTimeout()判断为true（超时）
    if (checkTimeout()) {
      console.log('超时了')
      // 退出 清除数据
      store.dispatch('user/logout')
      // 跳转页面
      router.push('/login')
      // 停止页面请求
      return Promise.reject(new Error('登陆信息过期，请重新登陆'))
    }
    config.headers.Authorization = `Bearer ${store.getters.token}`
  }
  // 放行
  return config
})

// 响应拦截器(有三种情况)
service.interceptors.response.use(
  res => {
    // 1请求成功
    console.log('这是网络层面的成功')
    console.log(res)
    // 请求成功的返回值里面有这三个值
    const { success, message, data } = res.data
    if (success) {
      // 1.1 数据获取成功并有返回值
      console.log('数据也获取成功')
      // 把请求成功的数据释放出去 这里不直接返回 res 而是从 res.data 中 解构出 data (res.data.data)
      return data
    } else {
      console.log('请求获取成功但数据获取失败了')
      // 给出提示，这个错误提示只是账号或密码错误
      Message.error(message)
      // 停止请求
      return Promise.reject(new Error(message))
    }
  },
  err => {
    // 后台token被动防御
    if (err.response && err.response.data && err.response.data.code === 10002) {
      // 退出 清除数据
      store.dispatch('user/logout')
      // 跳转页面
      router.push('/login')
    }
    // 2.请求失败 提示错误+停止请求
    console.log('这是网络层面的失败')
    console.dir(err)
    // 弹窗提示用户
    Message.error(err.message)
    // 这里应该用 Promise.reject 直接停止当前的请求过程
    return Promise.reject(new Error('请求服务器失败'))
  }
)

// 暴露service(service替代了axios)
export default service
